home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 051-060 / amok56 / turbofiles_v2.0 / turbofiles.asm < prev    next >
Assembly Source File  |  1993-11-04  |  18KB  |  580 lines

  1. ;
  2. ;(**********************************************************************
  3. ;
  4. ;    :Program.    TurboFiles.asm
  5. ;    :Contents.   The assemblerpart of the Module TurboFiles
  6. ;    :Author.     Stefan Salewski
  7. ;    :Address.    Stefan Salewski, Stolper Weg 3, D-2160 Stade
  8. ;    :Copyright.  FD
  9. ;    :Language.   68000-Assembler
  10. ;    :Translator. A68k-Assembler V2.61
  11. ;    :History.    V2.0     12-06-91
  12. ;    :Remark.     Now all Assembler-Procedures respects the Amiga-Dos-
  13. ;    :Remark.     Register-Conventions: This means that the Procedures
  14. ;    :Remark.     changes only D0,D1,A0,A1. The other Registers remain
  15. ;    :Remark.     unchanged.
  16. ;
  17. ;**********************************************************************)
  18. ; The public assembler-procedures:
  19.  
  20.   XDEF TurboReadChar
  21.   XDEF TurboReadBytes
  22.   XDEF TurboRead
  23.   XDEF TurboWriteChar
  24.   XDEF TurboWriteBytes
  25.   XDEF TurboWrite
  26.   XDEF TurboSetPos
  27.   XDEF TurboGetPos
  28.   XDEF TurboSize
  29.  
  30. ;-------------------------------------------------------------------
  31. ;CONST (* Error-Codes = file.res *)
  32. done         EQU 0;
  33. notdone      EQU 1;
  34. notOpen      EQU 2;
  35. openError    EQU 3;
  36. readError    EQU 4;
  37. writeError   EQU 5;
  38. seekError    EQU 6;
  39. endOfFile    EQU 7;
  40. outOfMem     EQU 8;
  41. notExists    EQU 9;
  42. ;-------------------------------------------------------------------
  43. ;Modes of Dos.Seek
  44. Dos_beginning  EQU    -1
  45. Dos_current    EQU     0
  46. Dos_end        EQU     1
  47. ;-------------------------------------------------------------------
  48. ;Modes for SetPos
  49. beginning      EQU     Dos_beginning
  50. current        EQU     Dos_current
  51. end            EQU     Dos_end
  52. ;-------------------------------------------------------------------
  53. ;The offsets of the Dos-functions:
  54. _Seek          EQU    -66
  55. _Write         EQU    -48
  56. _Read          EQU    -42
  57. ;-------------------------------------------------------------------
  58. ;The BOOLEAN constants:
  59. TRUE           EQU     -1
  60. FALSE          EQU     0
  61. ;-------------------------------------------------------------------
  62. ;The OBERON-Datastructure:
  63. ;File* = RECORD
  64. ;          fhPtr:Dos.FileHandlePtr;
  65. ;          dosBase:Exec.ADDRESS;
  66. ;          base:Exec.ADDRESS;
  67. ;          top:Exec.ADDRESS;
  68. ;          filePos:LONGINT;
  69. ;          startLength:LONGINT;
  70. ;          act:Exec.ADDRESS;
  71. ;          readTop:Exec.ADDRESS;
  72. ;          writeBase:Exec.ADDRESS;
  73. ;          writeTop:Exec.ADDRESS;
  74. ;          open:BOOLEAN;
  75. ;          res*:SHORTINT;
  76. ;        END;
  77. ;The offsets in the File-Variable:
  78. _fhPtr          EQU     0
  79. _dosBase        EQU     4
  80. _base           EQU     8
  81. _top            EQU     12
  82. _filePos        EQU     16
  83. _startLength    EQU     20
  84. _act            EQU     24
  85. _readTop        EQU     28
  86. _writeBase      EQU     32
  87. _writeTop       EQU     36
  88. _open           EQU     40
  89. _res            EQU     41
  90. ;*******************************************************************
  91. ;-------------------------------------------------------------------
  92. ;PROCEDURE TurboSize(VAR f{A0}:File):LONGINT;
  93. ;-------------------------------------------------------------------
  94. TurboSize:
  95. \f      EQUR  A0; ADDRESS (The address of the file-variable)
  96. ;-------------------------------------------------------------------
  97. \Start:
  98.        TST.B  _open(\f)
  99.        BEQ.S   \Error
  100.        TST.B  _res(\f)
  101.        BNE.S   \Error
  102.        MOVE.L  _filePos(\f),D0
  103.        ADD.L   _act(\f),D0
  104.        SUB.L   _readTop(\f),D0
  105.        MOVE.L  _startLength(\f),D1
  106.        CMP.L   D1,D0
  107.        BGE.S   \TheEnd
  108.        MOVE.L  D1,D0
  109.        BRA.S   \TheEnd
  110. \Error:
  111.        MOVEQ.L #-1,D0
  112. \TheEnd:
  113.        RTS
  114. ;*******************************************************************
  115. ;-------------------------------------------------------------------
  116. ;PROCEDURE TurboGetPos(VAR f{A0}:File):LONGINT;
  117. ;-------------------------------------------------------------------
  118. TurboGetPos:
  119. \f      EQUR  A0; ADDRESS (The address of the file-variable)
  120. ;-------------------------------------------------------------------
  121. \Start:
  122.        TST.B  _open(\f)
  123.        BEQ.S   \Error
  124.        TST.B  _res(\f)
  125.        BNE.S   \Error
  126.        MOVE.L  _filePos(\f),D0
  127.        ADD.L   _act(\f),D0
  128.        SUB.L   _readTop(\f),D0
  129.        BRA.S   \TheEnd
  130. \Error:
  131.        MOVEQ.L #-1,D0
  132. \TheEnd:
  133.        RTS
  134. ;*******************************************************************
  135. ;-------------------------------------------------------------------
  136. ;PROCEDURE TurboSetPos(VAR f{A0}:File;offset{D0}:LONGINT;
  137. ;                      mode{D1}:LONGINT):BOOLEAN;
  138. ;-------------------------------------------------------------------
  139. TurboSetPos:
  140. \f           EQUR  A2; ADDRESS (The address of the file-variable)
  141. \base        EQUR  A3;
  142. \dosBase     EQUR  A6;
  143. \getPos      EQUR  D2;  | These registers are changed by Seek and Write!!!
  144. \bufTop      EQUR  D3; /
  145. \newPos      EQUR  D4;
  146. \offset      EQUR  D5; VALUE
  147. \mode        EQUR  D6; VALUE
  148. ;-------------------------------------------------------------------
  149. \Start:
  150.        MOVEM.L D2-D6/A2/A3/A6,-(A7)
  151.        MOVE.L  A0,\f
  152.        MOVE.L  D0,\offset
  153.        MOVE.L  D1,\mode
  154.        TST.B  _open(\f)
  155.        BEQ     \Error
  156.        TST.B  _res(\f)
  157.        BNE     \Error
  158.        MOVE.L  _base(\f),\base
  159. \GetPosition:
  160.        MOVE.L  _filePos(\f),\getPos
  161.        ADD.L   _act(\f),\getPos
  162.        SUB.L   _readTop(\f),\getPos
  163. \GetFileLength:
  164.        CMP.L   _startLength(\f),\getPos
  165.        BLT.S   \GetBufTop
  166.        MOVE.L  \getPos,_startLength(\f)
  167. \GetBufTop:
  168.        MOVE.L  _readTop(\f),\bufTop
  169.        CMP.L   _writeTop(\f),\bufTop
  170.        BGE.S   \RelOffSet
  171.        MOVE.L  _writeTop(\f),\bufTop
  172. \RelOffSet:
  173.        CMPI.L  #current,\mode
  174.        BEQ.S   \NewPosition
  175.        TST.L   \offset
  176.        BPL.S   \Positiv
  177.        NEG.L   \offset
  178. \Positiv:
  179.        CMPI.L  #beginning,\mode
  180.        BNE.S   \NotBeginning
  181.        SUB.L   \getPos,\offset
  182.        BRA.S   \NewPosition
  183. \NotBeginning:
  184.        NEG.L   \offset
  185.        ADD.L   _startLength(\f),\offset
  186.        SUB.L   \getPos,\offset
  187. \NewPosition:
  188.        MOVE.L  _act(\f),\newPos
  189.        ADD.L   \offset,\newPos
  190. \NewPosInBuffer:
  191.        CMP.L   \base,\newPos
  192.        BLT.S   \NewPosInFile
  193.        CMP.L   \bufTop,\newPos
  194.        BGE.S   \NewPosInFile
  195.        MOVE.L  \newPos,_act(\f)
  196.        MOVEQ   #TRUE,D0
  197.        BRA.S   \TheEnd
  198. \NewPosInFile:
  199.        MOVE.L  \getPos,\newPos
  200.        ADD.L   \offset,\newPos
  201.        TST.L   \newPos
  202.        BMI.S   \SeekErr
  203.        CMP.L   _startLength(\f),\newPos
  204.        BGT.S   \SeekErr
  205.        MOVE.L  _writeTop(\f),D0
  206.        CMP.L   _writeBase(\f),D0
  207.        BLE.S   \BufferNotChanged
  208. \SaveBuffer:
  209.        MOVE.L  _fhPtr(\f),D1
  210.        MOVE.L  _writeBase(\f),D2
  211.        SUB.L   _readTop(\f),D2
  212.        MOVEQ   #Dos_current,D3
  213.        MOVE.L  _dosBase(\f),A6
  214.        JSR     _Seek(A6)
  215.        MOVE.L  _fhPtr(\f),D1
  216.        MOVE.L  _writeBase(\f),D2
  217.        MOVE.L  _writeTop(\f),D3
  218.        SUB.L   _writeBase(\f),D3
  219.        JSR     _Write(A6)
  220.        CMP.L   D0,D3
  221.        BNE.S   \WriteErr
  222.        MOVE.L  \base,_writeTop(\f)
  223.        MOVE.L  _top(\f),_writeBase(\f)
  224. \BufferNotChanged:
  225.        MOVE.L  _fhPtr(\f),D1
  226.        MOVE.L  \newPos,D2
  227.        MOVEQ   #Dos_beginning,D3
  228.        MOVE.L  _dosBase(\f),A6
  229.        JSR     _Seek(A6)
  230.        TST.L   D0 ; not necessary
  231.        BMI.S   \SeekErr
  232.        MOVE.L  \newPos,_filePos(\f)
  233.        MOVE.L  \base,_act(\f)
  234.        MOVE.L  \base,_readTop(\f)
  235.        MOVEQ   #TRUE,D0
  236.        BRA.S   \TheEnd
  237. \WriteErr:
  238.        MOVE.B  #writeError,_res(\f)
  239.        BRA.S   \Error
  240. \SeekErr:
  241.        MOVE.B  #seekError,_res(\f)
  242. \Error:
  243.        MOVEQ   #FALSE,D0
  244. \TheEnd:
  245.        MOVEM.L (A7)+,D2-D6/A2/A3/A6
  246.        RTS
  247. ;*******************************************************************
  248. ;This Routine changes only D0 !!!
  249. ;-------------------------------------------------------------------
  250. ;PROCEDURE SaveBuffer(VAR f{A0}:File):BOOLEAN;
  251. ;-------------------------------------------------------------------
  252. SaveBuffer:
  253. \f     EQUR A2 ; we get f in A0 and copy it to A2
  254. \ok    EQUR D0 ; ok=TRUE if all is ok
  255. ;-------------------------------------------------------------------
  256. \Start:
  257.        MOVEM.L D1/D2/D3/A0/A1/A2/A6,-(A7)
  258.        MOVE.L  A0,\f
  259.        MOVE.L  _dosBase(\f),A6
  260.        MOVE.L  _writeBase(\f),D2
  261.        SUB.L   _readTop(\f),D2
  262.        BEQ.S   \D20
  263.        MOVEQ   #Dos_current,D3
  264.        MOVE.L  _fhPtr(\f),D1
  265.        JSR     _Seek(A6)
  266. \D20:
  267.        MOVE.L  _writeTop(\f),D3
  268.        SUB.L   _writeBase(\f),D3
  269.        MOVE.L  _fhPtr(\f),D1
  270.        MOVE.L  _writeBase(\f),D2
  271.        JSR     _Write(A6)
  272.        CMP.L   D0,D3
  273.        BNE.S   \WriteErr
  274.        MOVE.L  _act(\f),D2
  275.        SUB.L   _writeTop(\f),D2
  276.        BEQ.S   \NoSeek
  277.        MOVE.L  _fhPtr(\f),D1
  278.        MOVEQ   #Dos_current,D3
  279.        JSR     _Seek(A6)
  280. \NoSeek:
  281.        MOVE.L  _act(\f),D0
  282.        SUB.L   _readTop(\f),D0
  283.        ADD.L   D0,_filePos(\f)
  284.        MOVE.L  _base(\f),_writeTop(\f)
  285.        MOVE.L  _top(\f),_writeBase(\f)
  286.        MOVEQ   #TRUE,\ok
  287.        BRA.S   \TheEnd
  288. \WriteErr:
  289.        MOVE.B  #writeError,_res(\f)
  290.        MOVEQ   #FALSE,\ok
  291. \TheEnd:
  292.        MOVEM.L (A7)+,D1/D2/D3/A0/A1/A2/A6
  293.        RTS
  294. ;*******************************************************************
  295. ;-------------------------------------------------------------------
  296. ;PROCEDURE TurboReadBytes(VAR f{A0}:File;adr{A1}:ADDRESS;
  297. ;                         len{D1}:LONGINT):LONGINT;
  298. ;-------------------------------------------------------------------
  299. TurboReadBytes:
  300. ;                    D0 is free to use
  301. \len           EQUR  D1; VALUE   (How many bytes to read)
  302. \actual        EQUR  D2;
  303. \f             EQUR  A0; ADDRESS   (The address of the file-variable)
  304. \adr           EQUR  A1; ADDRESS   (The address to put the data)
  305. \tempAct       EQUR  A2;
  306. \dosBase       EQUR  A6;
  307. ;-------------------------------------------------------------------
  308. \START:
  309.        MOVEM.L D2/A2,-(A7)
  310.        MOVEQ   #0,\actual
  311.        TST.B  _open(\f)
  312.        BEQ     \TheEnd
  313.        TST.B  _res(\f)
  314.        BNE     \TheEnd
  315.        TST.L   \len
  316.        BLE     \TheEnd
  317.        MOVE.L  _act(\f),\tempAct
  318. \MainLoop:
  319.        CMPA.L  _readTop(\f),\tempAct
  320.        BLT.S   \BufferNotEmpty
  321.        CMPA.L  _writeTop(\f),\tempAct
  322.        BLT.S   \BufferNotEmpty
  323. \FillBuffer:
  324.        MOVE.L  _writeTop(\f),D0
  325.        CMP.L   _writeBase(\f),D0
  326.        BLE.S   \BufferNotChanged
  327.        BSR      SaveBuffer
  328.        TST.L    D0 ; FALSE = 0
  329.        BEQ.S    \TheEnd
  330. \BufferNotChanged:
  331.        MOVEM.L D1/D2/D3/A0/A1/A6,-(A7)
  332.        MOVE.L  _top(\f),D3
  333.        SUB.L   _base(\f),D3
  334.        MOVE.L  _fhPtr(\f),D1
  335.        MOVE.L  _base(\f),D2
  336.        MOVE.L  _dosBase(\f),A6
  337.        JSR     _Read(A6)
  338.        MOVEM.L (A7)+,D1/D2/D3/A0/A1/A6
  339.        TST.L   D0
  340.        BEQ.S   \EOF
  341.        ADD.L   D0,_filePos(\f)
  342.        MOVEA.L _base(\f),\tempAct
  343.        ADD.L   \tempAct,D0
  344.        MOVE.L  D0,_readTop(\f)
  345. \BufferNotEmpty:
  346.        MOVE.L  _readTop(\f),D0
  347.        CMP.L   _writeTop(\f),D0
  348.        BGE.S   \RTGtr
  349.        MOVE.L  _writeTop(\f),D0
  350. \RTGtr:
  351.        SUB.L   \tempAct,D0
  352.        CMP.L   \len,D0
  353.        BLE.S   \ok
  354.        MOVE.L  \len,D0
  355. \ok:
  356.        ADD.L   D0,\actual
  357.        SUB.L   D0,\len
  358.        SUBQ.L  #1,D0
  359. \CopyLoop:
  360.        MOVE.B  (\tempAct)+,(\adr)+
  361.        DBRA.S  D0,\CopyLoop
  362.        MOVE.L  \tempAct,_act(\f)
  363.        TST.L   \len
  364.        BNE.S   \MainLoop
  365.        BRA.S   \TheEnd
  366. \EOF:
  367.        MOVE.B  #endOfFile,_res(\f)
  368. \TheEnd:
  369.        MOVE.L  \actual,D0
  370.        MOVEM.L (A7)+,D2/A2
  371.        RTS
  372. ;*******************************************************************
  373. ;-------------------------------------------------------------------
  374. ;PROCEDURE TurboRead(VAR f:File;VAR to:ARRAY OF BYTE):BOOLEAN;
  375. ;-------------------------------------------------------------------
  376. ;PROCEDURE TurboReadBytes(VAR f{A0}:File;adr{A1}:ADDRESS;
  377. ;                         len{D1}:LONGINT):LONGINT;
  378. ;-------------------------------------------------------------------
  379. TurboRead:
  380. \Start:
  381.         MOVEA.L 10(A7),A0       ; ADR(f)
  382.         MOVEA.L 6(A7),A1        ; ADR(to)
  383.         MOVE.W  4(A7),D1        ; LEN(to)
  384.         EXT.L   D1
  385.         BSR     TurboReadBytes
  386.         MOVE.W  4(A7),D1
  387.         EXT.L   D1
  388.         CMP.L   D1,D0
  389.         SEQ     D0
  390.         MOVEA.L (A7)+,A0        ; ReturnAdr
  391.         LEA     10(A7),A7
  392.         JMP     (A0)
  393. ;*******************************************************************
  394. ;-------------------------------------------------------------------
  395. ;PROCEDURE TurboReadChar(VAR f{A0}:File;VAR c{A1}:CHAR):BOOLEAN;
  396. ;-------------------------------------------------------------------
  397. TurboReadChar:
  398. ;                    D0 is free to use
  399. \f             EQUR  A0; ADDRESS   (The address of the file-variable)
  400. \c             EQUR  A1; ADDRESS   (The address to put the data)
  401. \dosBase       EQUR  A6;
  402. ;-------------------------------------------------------------------
  403. \START:
  404.        TST.B  _open(\f)
  405.        BEQ.S   \Error
  406.        TST.B  _res(\f)
  407.        BNE.S   \Error
  408.        MOVE.L  _act(\f),D0
  409. \MainLoop:
  410.        CMP.L   _readTop(\f),D0
  411.        BLT.S   \BufferNotEmpty
  412.        CMP.L   _writeTop(\f),D0
  413.        BLT.S   \BufferNotEmpty
  414. \FillBuffer:
  415.        MOVE.L  _writeTop(\f),D0
  416.        CMP.L   _writeBase(\f),D0
  417.        BLE.S   \BufferNotChanged
  418.        BSR      SaveBuffer
  419.        TST.L    D0 ; FALSE = 0
  420.        BEQ.S    \Error
  421. \BufferNotChanged:
  422.        MOVEM.L D2/D3/A0/A1/A6,-(A7)
  423.        MOVE.L  _top(\f),D3
  424.        SUB.L   _base(\f),D3
  425.        MOVE.L  _base(\f),D2
  426.        MOVE.L  _fhPtr(\f),D1
  427.        MOVE.L  _dosBase(\f),A6
  428.        JSR     _Read(A6)
  429.        MOVEM.L (A7)+,D2/D3/A0/A1/A6
  430.        TST.L   D0
  431.        BEQ.S   \EOF
  432.        ADD.L   D0,_filePos(\f)
  433.        MOVE.L  _base(\f),_act(\f)
  434.        ADD.L   _base(\f),D0
  435.        MOVE.L  D0,_readTop(\f)
  436. \BufferNotEmpty:
  437.        ADDQ.L  #1,_act(\f)
  438.        MOVE.L  _act(\f),\f
  439.        MOVE.B  -(\f),(\c)
  440.        MOVEQ   #TRUE,D0
  441.        RTS
  442. \EOF:
  443.        MOVE.B  #endOfFile,_res(\f)
  444. \Error:
  445.        MOVEQ   #FALSE,D0
  446. \TheEnd:
  447.        RTS
  448.  
  449. ;*******************************************************************
  450. ;-------------------------------------------------------------------
  451. ;PROCEDURE TurboWriteBytes(VAR f{A0}:File;adr{A1}:ADDRESS;
  452. ;                          len{D1}:LONGINT):BOOLEAN;
  453. ;-------------------------------------------------------------------
  454. TurboWriteBytes:
  455. ;                  D0 is free to use
  456. \len         EQUR  D1; VALUE   (How many bytes to read)
  457. \f           EQUR  A0; ADDRESS (The address of the file-variable)
  458. \adr         EQUR  A1; ADDRESS (The address to take the data from)
  459. \tempAct     EQUR  A2;
  460. ;-------------------------------------------------------------------
  461. \START:
  462.        MOVEM.L A2,-(A7)
  463.        TST.B  _open(\f)
  464.        BEQ.S   \Error
  465.        TST.B  _res(\f)
  466.        BNE.S   \Error
  467.        TST.L   \len
  468.        BLE.S   \Error
  469.        MOVE.L  _act(\f),\tempAct
  470. \MainLoop:
  471.        CMP.L   _top(\f),\tempAct
  472.        BLT.S   \BufferNotFull
  473. \InitBuffer:
  474.        MOVE.L  _writeTop(\f),D0
  475.        CMP.L   _writeBase(\f),D0
  476.        BLE.S   \BufferNotChanged
  477.        BSR      SaveBuffer
  478.        TST.L    D0 ; FALSE = 0
  479.        BEQ.S    \Error
  480. \BufferNotChanged:
  481.        MOVE.L  _base(\f),\tempAct
  482.        MOVE.L  \tempAct,_readTop(\f)
  483. \BufferNotFull:
  484.        CMP.L   _writeBase(\f),\tempAct
  485.        BGE.S   \WriteBaseNotChanged
  486.        MOVE.L  \tempAct,_writeBase(\f)
  487. \WriteBaseNotChanged:
  488.        MOVE.L  _top(\f),D0
  489.        SUB.L   \tempAct,D0
  490.        CMP.L   \len,D0
  491.        BLE.S   \ok
  492.        MOVE.L  \len,D0
  493. \ok:
  494.        SUB.L   D0,\len
  495.        SUBQ.L  #1,D0
  496. \CopyLoop:
  497.        MOVE.B  (\adr)+,(\tempAct)+
  498.        DBRA    D0,\CopyLoop
  499.        CMP.L   _writeTop(\f),\tempAct
  500.        BLE.S   \WriteTopNotChanged
  501.        MOVE.L  \tempAct,_writeTop(\f)
  502. \WriteTopNotChanged:
  503.        MOVE.L  \tempAct,_act(\f)
  504.        TST.L   \len
  505.        BNE.S   \MainLoop
  506.        MOVEQ   #TRUE,D0
  507.        BRA.S   \TheEnd
  508. \Error:
  509.        MOVEQ   #FALSE,D0
  510. \TheEnd:
  511.        MOVEM.L (a7)+,A2
  512.        RTS
  513. ;*******************************************************************
  514. ;-------------------------------------------------------------------
  515. ;PROCEDURE TurboWrite(VAR f:File;from:ARRAY OF BYTE):BOOLEAN;
  516. ;-------------------------------------------------------------------
  517. ;PROCEDURE TurboWriteBytes(VAR f{A0}:File;adr{A1}:ADDRESS;
  518. ;                          len{D1}:LONGINT):BOOLEAN;
  519. ;-------------------------------------------------------------------
  520. TurboWrite:
  521. \Start:
  522.         MOVEA.L 10(A7),A0              ;ADR(f)
  523.         MOVEA.L 6(A7),A1               ;ADR(from)
  524.         MOVE.W  4(A7),D1               ;LEN(from)
  525.         EXT.L   D1
  526.         BSR     TurboWriteBytes
  527.         MOVEA.L (A7)+,A0               ;Return-Adr
  528.         LEA     10(A7),A7              ;remove parameters from stack
  529.         JMP     (A0)
  530. ;*******************************************************************
  531. ;-------------------------------------------------------------------
  532. ;PROCEDURE TurboWriteChar(VAR f{A0}:File;c{D1}:CHAR):BOOLEAN;
  533. ;-------------------------------------------------------------------
  534. TurboWriteChar:
  535. ;                  D0 is free to use
  536. \c           EQUR  D1; VALUE   (The Character )
  537. \f           EQUR  A0; ADDRESS (The address of the file-variable)
  538. \tempAct     EQUR  A1;
  539. ;-------------------------------------------------------------------
  540. \START:
  541.        TST.B  _open(\f)
  542.        BEQ.S   \Error
  543.        TST.B  _res(\f)
  544.        BNE.S   \Error
  545.        MOVE.L  _act(\f),\tempAct
  546. \MainLoop:
  547.        CMP.L   _top(\f),\tempAct
  548.        BLT.S   \BufferNotFull
  549. \InitBuffer:
  550.        MOVE.L  _writeTop(\f),D0
  551.        CMP.L   _writeBase(\f),D0
  552.        BLE.S   \BufferNotChanged
  553.        BSR      SaveBuffer
  554.        TST.L    D0 ; FALSE = 0
  555.        BEQ.S    \Error
  556. \BufferNotChanged:
  557.        MOVE.L  _base(\f),\tempAct
  558.        MOVE.L  \tempAct,_readTop(\f)
  559. \BufferNotFull:
  560.        CMP.L   _writeBase(\f),\tempAct
  561.        BGE.S   \WriteBaseNotChanged
  562.        MOVE.L  \tempAct,_writeBase(\f)
  563. \WriteBaseNotChanged:
  564.        MOVE.B  \c,(\tempAct)+
  565.        CMP.L   _writeTop(\f),\tempAct
  566.        BLE.S   \WriteTopNotChanged
  567.        MOVE.L  \tempAct,_writeTop(\f)
  568. \WriteTopNotChanged:
  569.        MOVE.L  \tempAct,_act(\f)
  570.        MOVEQ   #TRUE,D0
  571.        RTS
  572. \Error:
  573.        MOVEQ   #FALSE,D0
  574. \TheEnd:
  575.        RTS
  576.  
  577.        END
  578.  
  579.  
  580.